﻿using System;
using System.Collections.Generic;
using TPDiseño.Clases_de_Entidad;
using DAO.DataSetConsultoraTableAdapters;

namespace DAO
{
    public class DAOCandidato : DAO {
        //Atributos de manejo de instancia (singleton)
        static DAOCandidato instance = null; 
        // Atributos para acceso a los DataSet Tipados
        private DataSetConsultora.CandidatosDataTable CandidatosTabla = new DataSetConsultora.CandidatosDataTable();
        private CandidatosTableAdapter CandidatosTableAdapter = new CandidatosTableAdapter();

        public static DAOCandidato Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAOCandidato();
                        }
                    }
                }
                return instance;
            }
        }

        public List<Candidato> cargar()
        {

            // Cargo los Candidato de la db
            CandidatosTabla = CandidatosTableAdapter.GetData();

            // Finalmente devuelvo la lista de CandidatosCargados, recolectadas por la funcion            
            return recolectar();
        }

        public Candidato cargar(int id_candidato)
        {

            // Cargo los Candidato de la db
            CandidatosTabla = CandidatosTableAdapter.consultarPorId(id_candidato);

            // Finalmente devuelvo la lista de CandidatosCargados, recolectadas por la funcion            
            return recolectarUno();
        }

        public Candidato cargar(int num_doc, string tipo_doc)
        {

            // Cargo los Candidato de la db
            CandidatosTabla = CandidatosTableAdapter.consultarPorDocumneto(num_doc.ToString(),
                                                                           tipo_doc
                                                                          );
            
            // Finalmente devuelvo la lista de CandidatosCargados, recolectadas por la funcion            
            return recolectarUno();
        }

        public List<Candidato> cargar(string unNombre, string unApellido, string unNrCandidato, string unNrEmpleado)
        {
            // Cargo los Candidato de la db
            CandidatosTabla = CandidatosTableAdapter.consultarPorNombreApellidoNumeros(unNombre, 
                                                                                       unApellido, 
                                                                                       unNrCandidato, 
                                                                                       unNrEmpleado
                                                                                       );

            return recolectar();
        }
            
        

        private List<Candidato> recolectar()
        {

            // Creo la lista para recolectar y devolver los Candidatos cargadas de la db
            List<Candidato> CandidatosCargados = new List<Candidato>();

            // Recorro los Candidatos de la tabla
            foreach (DataSetConsultora.CandidatosRow unaCandidatoFila in CandidatosTabla)
            {

                // Creo un Candidato y lo agrego a la lista de Candidatos cargados
                CandidatosCargados.Add(new Candidato(unaCandidatoFila.id,
                                                     unaCandidatoFila.tipo,
                                                     unaCandidatoFila.nro_documento,
                                                     unaCandidatoFila.nombre,
                                                     unaCandidatoFila.apellido,
                                                     unaCandidatoFila.email,
                                                     unaCandidatoFila.genero.ToString(),
                                                     unaCandidatoFila.fecha_nacimiento,
                                                     unaCandidatoFila.escolariodad,
                                                     unaCandidatoFila.nacionalidad,
                                                     unaCandidatoFila.nro_empleado,
                                                     unaCandidatoFila.nro_candidato,
                                                     unaCandidatoFila.eliminado)
                                                     );


            }

            return CandidatosCargados;
        }

        public Candidato recolectarUno()
        {

            if (CandidatosTabla.Count > 0)
            {

                // Finalmente retorno un nuevo objeto Candidato mapeado de la tabla
                return new Candidato(CandidatosTabla[0].id,
                                     CandidatosTabla[0].tipo,
                                     CandidatosTabla[0].nro_documento,
                                     CandidatosTabla[0].nombre,
                                     CandidatosTabla[0].apellido,
                                     CandidatosTabla[0].email,
                                     CandidatosTabla[0].genero.ToString(),
                                     CandidatosTabla[0].fecha_nacimiento,
                                     CandidatosTabla[0].escolariodad,
                                     CandidatosTabla[0].nacionalidad,
                                     CandidatosTabla[0].nro_empleado,
                                     CandidatosTabla[0].nro_candidato,
                                     CandidatosTabla[0].eliminado);
            }
            else
            {
                return new Candidato();
            }


        }
    }
}
